

package enterprise.jsf_jpa_war;

import enterprise.ent.Administradores;
import enterprise.ent.Country;
import enterprise.ent.Jugadores;
import enterprise.ent.Solicitudes;
import enterprise.ent.Torneos;
import enterprise.ent.Usuarios;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.transaction.NotSupportedException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import org.primefaces.event.FileUploadEvent;  
import org.primefaces.model.UploadedFile;  

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named
public class controlSolicitudes {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx2;
    
    //variables Administradores
    //public String solicID;
    public Integer solicTipo;
    //public String solicFecha;
    public Long solicUser;
    public String solicDetalle;

    public List<Solicitudes> vListaSolicitudes;

    public List<Solicitudes> getvListaSolicitudes() {
        return vListaSolicitudes;
    }

    public void setvListaSolicitudes(List<Solicitudes> vListaSolicitudes) {
        this.vListaSolicitudes = vListaSolicitudes;
    }
  
    public Integer getSolicTipo() {
        return solicTipo;
    }

    public void setSolicTipo(Integer solicTipo) {
        this.solicTipo = solicTipo;
    }

    public Long getSolicUser() {
        return solicUser;
    }

    public void setSolicUser(Long solicUser) {
        this.solicUser = solicUser;
    }

    public String getSolicDetalle() {
        return solicDetalle;
    }

    public void setSolicDetalle(String solicDetalle) {
        this.solicDetalle = solicDetalle;
    }

    public boolean esTipoNuevoTorneo(Long idsolicitud){
        if(idsolicitud == 1){
            return true;
        }else{
            return false;
        }
    }
    public boolean esTipoAltaNuevoJugador(Long idsolicitud){
        if(idsolicitud == 2){
            return true;
        }else{
            return false;
        }
    }
    
    public void ir_solicitudes(){ 
        Map sMap;
        sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
        bm.spagina = "solicitudes";
        
        System.out.println("pasa por eki solicitudes:" + bm.spagina );
        
        //Carga la lista de solicitudes
        vListaSolicitudes = findAllSolicitudes();

    }
    
    public void createSolicitudNuevoTorneo(ActionEvent event) {
        
        System.out.println("Entra create solicitud de nuevo torneo!");
        solicTipo = 1;
        createSolicitud();
    }
    
    public void createSolicitud() {
        FacesContext context = FacesContext.getCurrentInstance();
        Solicitudes wsolic = new Solicitudes();

        wsolic.setSolTipo(solicTipo);
        //wsolic.setSolUser(solicUser);
        wsolic.setSolDetalle(solicDetalle);
        wsolic.setSolFecha(new Date());
        wsolic.setSolEstado(1);
        
            try {
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                Usuarios usr = (Usuarios) sMap.get("user");
                Long IdCurrentUser = usr.getIdUsuario();
                System.out.println("usuario obtenido: " + IdCurrentUser);
                wsolic.setSolUser(IdCurrentUser);
                
//                System.out.println("NUEVA SOLICITUD -> SOLIC TIPO: " + solicTipo);
//                System.out.println("NUEVA SOLICITUD -> SOLIC USER: " + IdCurrentUser);
//                System.out.println("NUEVA SOLICITUD -> SOLIC DETALLE: " + solicDetalle);
//                System.out.println("NUEVA SOLICITUD -> SOLIC DETALLE: " + wsolic.getSolEstado());
                
                
                utx2.begin();
                em.persist(wsolic);
                utx2.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_recibida}", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "#{msg.en_poco_tiempo_obtendras_respuesta}", String.class));
                context.addMessage("creategrowl", message);
                
                
                //Carga la lista de solicitudes
                vListaSolicitudes = findAllSolicitudes();
               
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
                bm.esAdmin = true;
                bm.spagina = "solicitudes";
                
                //return "app-main";
                //return null;
            } catch (Exception e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            }     
        }
    
        public List<Solicitudes> findAllSolicitudes() {
            Query query = em.createNamedQuery("Solicitudes.findBySolUser_UserView");
            Map sMap;
            sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
            Usuarios usr = (Usuarios) sMap.get("user");
            Long IdCurrentUser = usr.getIdUsuario();
            Long paramLike = IdCurrentUser;
            query.setParameter("solUser", paramLike);
            List<Solicitudes> tmpSolicitudes = query.getResultList();
            return tmpSolicitudes;
        }
        
        public String imgEstado(Integer estado){
            if(estado == 0){ return "aceptada"; }
            if(estado == 1){ return "pendiente"; }
            if(estado == 2){ return "incorrecta"; }
            if(estado == 3){ return "denegada"; }
            if(estado == 4){ return "pendienteuser"; }
            //9 borrada por eol usuario
            //10 acaptada por usuario para crear torneo
            return "pendiente";
        }
        public String descEstado(Integer estado){
            FacesContext context = FacesContext.getCurrentInstance();
            if(estado == 0){ return context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_estado_aceptada}", String.class); }
            if(estado == 1){ return context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_estado_pendiente}", String.class); }
            if(estado == 2){ return context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_estado_incorrecta}", String.class); }
            if(estado == 3){ return context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_estado_denegada}", String.class); }
            if(estado == 4){ return context.getApplication().evaluateExpressionGet(context, "#{msg.solicitud_estado_pendienteuser}", String.class); }
            return " ";
        }

        public void actuEstadoSolicitud(Long idsolicitud, Integer estado) {
            System.out.println("actualizando SOLICITUD -> SOLIC ID: " + idsolicitud + " ---> a estado: " + estado);
            FacesContext context = FacesContext.getCurrentInstance();
            try{
                utx2.begin();
                Solicitudes s = (Solicitudes)
                    em.createNamedQuery("Solicitudes.findBySolId").
                            setParameter("solId", idsolicitud).getSingleResult();
                s.setSolEstado(estado);
                utx2.commit();
                
                //Carga la lista de solicitudes
                vListaSolicitudes = findAllSolicitudes();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Hecho!",  null);  
                FacesContext.getCurrentInstance().addMessage(null, message);
                
            } catch (Exception e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                            "Error inesperado actualizando solicitud!",
                                                            "Por favor contacta con el Administrador del sistema.");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Error inesperado actualizando solicitud",
                                                e);
            }
        }
        
        
        public void actuBorrarSolicitud(Long idsolicitud) {
            System.out.println("BORRANDO SOLICITUD -> SOLIC ID: " + idsolicitud);
            FacesContext context = FacesContext.getCurrentInstance();
            try{
                utx2.begin();
                Solicitudes s = (Solicitudes)
                    em.createNamedQuery("Solicitudes.findBySolId").
                            setParameter("solId", idsolicitud).getSingleResult();
                s.setSolEstado(9); // 4 es estado de borrada por el usuario
                utx2.commit();
                
                //Carga la lista de solicitudes
                vListaSolicitudes = findAllSolicitudes();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Hecho!",  "La solicitud ha sido eliminada.");  
                FacesContext.getCurrentInstance().addMessage(null, message);
                
            } catch (Exception e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                            "Error inesperado borrando solicitud!",
                                                            "Por favor contacta con el Administrador del sistema.");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Error inesperado borrando solicitud",
                                                e);
            }
        }
        
        
    
//        public void submit(ActionEvent event) {  
//            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Correct", "Correct");  
//          
//            FacesContext.getCurrentInstance().addMessage(null, msg);  
//            Map sMap;
//            sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
//            BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
//            bm.esAdmin = true;
//            bm.spagina = "solicitudes";
//        }  
//    
    
    }
